<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>rest参数</title>
</head>

<body>
  <script>
    /* 
      ES6 引入 rest 参数，用于获取函数的实参，用来代替 arguments
    */
   
    // ES5 获取实参的方式
    /* 
      function date() {
        console.log(arguments)  // 返回对象
      }
      date('白芷', '阿娇', '思慧') 
    */

    // rest 参数
    function date(...args) {
      console.log(args)         // 返回数组 filter some every map
    }
    date('白芷', '阿娇', '思慧');

    // rest 参数必须要放到参数最后
    /* 
      function fn(a, ...args, b) {
        console.log(a, b, ...args)  
      }

      fn(1, 2, 3, 4, 5, 6)  // 报错： Uncaught SyntaxError: Rest parameter must be last formal parameter 
    */

    function fn(a, b, ...args) {
      console.log(a, b, ...args)
    }

    fn(1, 2, 3, 4, 5, 6)

    let arr = [0,1,2],
        min;
    
    min = Math.min(0,1,2)
    console.log(min)

    min = Math.min.apply(undefined, arr)
    console.log(min)

    min = Math.min(...arr)
    console.log(min)

    // 剩余参数被解构 参数中的元素可以被赋给函数体中的同名变量
    function destructuring (name, ...[age]) {
      console.log(name)
      console.log(age)
    }

    destructuring("jame", 28)

    /* 
      注意：
      1. 剩余参数必须放在最后
      2.不能对象字面量的setter方法中声明
    */

    /* var obj = {
      set age(...value) {
        this._age = value
      }
    } */

    // 函数传参
    // 常规操作
    function func1(info) {
      console.log(info.name)
      console.log(info.age)
    }

    func1({name: "Li", age: 29})

    // 参数 对象解构
    function func2({name, age}) {
      console.log(name)
      console.log(age)
    }

    func2({name: "Li", age: 29})
    // func2() // 报错  参数必须是一个对象
    function func2({name, age} = {}) {
      console.log(name)
      console.log(age)
    }

    func2() // 正常 默认值处理了

    // 参数 数组解构
    function func3(...[name, age]) {
      console.log(name)
      console.log(age)
    }

    func3("Li", 29)


  </script>
</body>

</html>